using System;
using System.Windows.Input;
using WPF_MVVM_Test.MVVM_Model;

namespace WPF_MVVM_Test.MVVM_ViewModel
{
    /// <summary>
    /// 主窗口的ViewModel - MVVM模式中的ViewModel层
    /// 作用：
    /// 1. 作为View和Model之间的桥梁
    /// 2. 处理所有的业务逻辑（登录验证）
    /// 3. 管理界面状态和用户交互
    /// 4. 提供数据绑定的属性和命令
    /// 为什么继承BaseViewModel：
    /// 1. 获得属性变更通知功能
    /// 2. 支持WPF的数据绑定机制
    /// 3. 使用基类提供的SetProperty和CreateCommand方法减少重复代码
    /// </summary>
    public class MainWindowViewModel : BaseViewModel
    {
        // 私有字段：存储Account模型实例
        private Account _currentAccount;
        
        // 私有字段：存储消息文本
        private string _message = string.Empty;

        /// <summary>
        /// 构造函数：初始化ViewModel
        /// 优化说明：使用基类的CreateCommand方法创建命令，代码更简洁
        /// </summary>
        public MainWindowViewModel()
        {
            _currentAccount = new Account();
            LoginCommand = CreateCommand(ExecuteLogin, CanExecuteLogin);
        }

        /// <summary>
        /// 用户名属性 - 优化后使用更直接的方式
        /// </summary>
        public string UserName
        {
            get => _currentAccount.AccountName;
            set
            {
                if (_currentAccount.AccountName != value)
                {
                    _currentAccount.AccountName = value;
                    OnPropertyChanged();
                }
            }
        }

        /// <summary>
        /// 密码属性 - 优化后使用更直接的方式
        /// </summary>
        public string Password
        {
            get => _currentAccount.AccountPwd;
            set
            {
                if (_currentAccount.AccountPwd != value)
                {
                    _currentAccount.AccountPwd = value;
                    OnPropertyChanged();
                }
            }
        }

        /// <summary>
        /// 消息属性 - 使用基类的SetProperty方法
        /// 优化说明：
        /// 1. 使用SetProperty方法，自动处理值比较和属性通知
        /// 2. 代码更简洁，逻辑更清晰
        /// </summary>
        public string Message
        {
            get => _message;
            set => SetProperty(ref _message, value);
        }

        /// <summary>
        /// 登录命令 - 使用基类创建
        /// </summary>
        public ICommand LoginCommand { get; }

        /// <summary>
        /// 判断登录命令是否可执行
        /// 优化说明：添加命令可执行性验证，提升用户体验
        /// </summary>
        private bool CanExecuteLogin()
        {
            return !string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(Password);
        }

        /// <summary>
        /// 执行登录的方法 - 优化后的业务逻辑
        /// </summary>
        private void ExecuteLogin()
        {
            // 由于有CanExecuteLogin方法，这里不需要再次验证输入
            // 直接执行业务逻辑
            if (UserName == "admin" && Password == "123456")
            {
                Message = $"登录成功！欢迎 {UserName}";
            }
            else
            {
                Message = "用户名或密码错误";
            }
        }
    }
}